package book;

public class LCS_Solution {
    // 求最长公共子序列
    public int LCS(String x, String y) {
        // 创建备忘录，求解重叠子问题
        // 令dp[i][j] 为 x[0..i-1](也就是前i个字符) 与 y[0..j-1]
        // (也就是前j个字符)的LCS长度
        int[][] dp = new int[x.length() + 1][y.length() + 1];
        for (int i = 1; i <= x.length(); i++)
            for (int j = 1; j <= y.length(); j++) {
                // 分支1：两个子串的末尾字符相等
                if (x.charAt(i - 1) == y.charAt(j - 1)) {
                    dp[i][j] = 1 + dp[i - 1][j - 1];
                }
                // 分支2：末尾字符不相等
                else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        // 返回结果
        return dp[x.length()][y.length()];
    }

    public static void main(String[] args) {
        String x = "abcd", y = "acedb";
        int len = new LCS_Solution().LCS(x, y);
        System.out.println("最长公共子序列长度为: " + len);
    }
}
